Since others have already answered the question about how to call the "copy constructor" (which would be to pass the other instance to the constructor: TestStruct B = new TestStruct(A);), I'll try to answer the other questions.
"Can you have a copy constructor for a C# struct, that works like a C++ copy constructor?"
No. In C++ a copy constructor is automatically called during an assignment of a type to another instance of that type. In C#, a shallow copy of the object is made, meaning that the value of value-type members is copied, and the reference of reference-type members is copied.
From the comments: "Can you overload the assignment operator?"
No. The assignment operator is not something that can be redefined. The default behavior for the language is what happens every time. Of course you can write your own method that returns a new instance of a type based on the property values of another instance, but that method must be called explicitly, and cannot be defined such that it's called during an assignement.
Also from the comments: "I am trying to transparently replace a native value type (int) with a struct or class"
Well now here it sounds like you might have something to work with. Although I'm really not sure what you mean by "replace a native value type", c# does allow you to write your own user-defined conversion operators which allow implicit (and explicit) conversions between two types. This effectively overrides the assignment operator when you're assigning from a different type.
Granted, this is not what your example is doing, but based on your comment it may be useful.
For example, if you wanted to create in instance of your struct from an int, you can do:
struct MyIntReplacement
{
public int MyValue { get; set; }
public static implicit operator MyIntReplacement(int value)
{
return new MyIntReplacement { MyValue = value };
}
}
And now you can do something like:
int someValue = 5;
MyIntReplacement foo = someValue;